{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "37179b99-bd3f-48d5-b0a7-c478c568ccb6",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b263e5b3-51b3-4f61-9a5c-3589c73d65b3",
   "metadata": {},
   "source": [
    "# 用个例子来理解梯度下降算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "9620984d-2900-43b5-940b-29d76e2df598",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 随便写一个函数\n",
    "f = lambda x: (x-2.5)**2 + 5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "3bd5ce80-9869-4bc0-ba6e-249167cbc436",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 画出函数图像\n",
    "plt.figure(figsize=(5, 6))\n",
    "\n",
    "x = np.linspace(-10, 15, 100)\n",
    "y = f(x)\n",
    "\n",
    "plt.plot(x, y)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2b358a28-2fac-4e9a-a326-a204692b61b3",
   "metadata": {},
   "source": [
    "梯度下降不关心你的最小值是多少，即目的不是为了求最小值，而是为了求f(x)取最小值的时候，x是多少"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7af91609-4c6e-4cd5-abb3-4a27205829d4",
   "metadata": {},
   "source": [
    "$$\n",
    "x = x - \\alpha dx\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "62de1919-f12c-4344-b669-079675e7f5a9",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 求出导函数\n",
    "dx = lambda x: 2 * (x - 2.5)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "510169ff-8438-491a-b2e2-8680f272b342",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "## 方法一：使用最大迭代次数作为退出条件更新梯度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "c8345437-4710-4e28-814c-a283db6d4f94",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 随便取一个点，作为起始的更新点\n",
    "x_origin = -8\n",
    "\n",
    "# 学习率\n",
    "learning_rate = 0.01\n",
    "# 最大迭代次数\n",
    "max_iter = 2000\n",
    "# 阈值\n",
    "threshold = 1e-5\n",
    "\n",
    "# 统计实际迭代次数\n",
    "i = 0\n",
    "# 每次更新的x保存下来\n",
    "ret = []\n",
    "\n",
    "while True:\n",
    "    ret.append(x_origin)\n",
    "    # 更新参数\n",
    "    x_origin = x_origin - learning_rate * dx(x_origin)\n",
    "    i += 1\n",
    "    # 退出条件列出三种来\n",
    "    # 第一种：达到最大迭代次数\n",
    "    if i > max_iter:\n",
    "        break\n",
    "    # # 第二种：梯度小于阈值\n",
    "    # if abs(dx(x_origin)) < threshold:\n",
    "    #     break\n",
    "    # # 第三种：相邻两次的x值相差小于阈值\n",
    "    # if abs(x_origin - ret[-1]) < threshold:\n",
    "    #     break\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "f87ed75e-6182-493b-9567-2c6c88888350",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2001"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看更新结果\n",
    "len(ret)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "39ddcdb2-509e-4625-8b1f-e7a49efe0141",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[-8, -7.79, -7.5842, -7.382516, -7.18486568]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ret[:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "628dc0bd-c97a-4af4-bc62-0bc4b16276d7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-21.0"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dx(-8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "75f53310-cbba-489f-9821-5c1703f007a7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-7.79"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 手算验证一下\n",
    "-8 - 0.01*-21."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "a0551001-4dd6-49a4-954a-b86f397b7f60",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 画出梯度下降可视化效果\n",
    "plt.figure(figsize=(5, 6))\n",
    "\n",
    "plt.plot(x, y)\n",
    "plt.scatter(x=ret[:400], y=[f(t) for t in ret[:400]], marker='.', c='r')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0bf38b6a-966b-4e7c-b197-795454e46151",
   "metadata": {},
   "source": [
    "## 方法二：使用梯度更新小于阈值作为退出条件更新梯度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "233d14c9-ed72-49fa-9985-a127a4473a59",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 随便取一个点，作为起始的更新点\n",
    "x_origin = -8\n",
    "\n",
    "# 学习率\n",
    "learning_rate = 0.01\n",
    "# 最大迭代次数\n",
    "max_iter = 2000\n",
    "# 阈值\n",
    "threshold = 1e-5\n",
    "\n",
    "# 统计实际迭代次数\n",
    "i = 0\n",
    "# 每次更新的x保存下来\n",
    "ret = []\n",
    "\n",
    "while True:\n",
    "    ret.append(x_origin)\n",
    "    # 更新参数\n",
    "    x_origin = x_origin - learning_rate * dx(x_origin)\n",
    "    i += 1\n",
    "    # 退出条件列出三种来\n",
    "    # # 第一种：达到最大迭代次数\n",
    "    # if i > max_iter:\n",
    "    #     break\n",
    "    # 第二种：梯度小于阈值\n",
    "    if abs(dx(x_origin)) < threshold:\n",
    "        break\n",
    "    # # 第三种：相邻两次的x值相差小于阈值\n",
    "    # if abs(x_origin - ret[-1]) < threshold:\n",
    "    #     break"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "d3ae721c-6683-4a4a-9f31-429f8b668f07",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "721"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看实际迭代次数\n",
    "i"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "bf3cdf1c-cab5-4e9d-8752-c3d49d8e4ae1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "721"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(ret)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "9a6f3300-07dd-4882-9ae3-65fd2a7ae0e1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 画出梯度下降算法的可视化结果\n",
    "plt.figure(figsize=(5, 6))\n",
    "\n",
    "plt.plot(x, y)\n",
    "plt.scatter(x=ret[:400], y=[f(x) for x in ret[:400]], marker='.', c='r')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "023514bd-a8b9-4d3f-a4d0-f6bd0514df11",
   "metadata": {},
   "source": [
    "## 研究学习率对梯度下降的影响"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "54f51316-8ef7-4935-bbd9-503f1c929062",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 把上面的代码做一个封装\n",
    "def gradient_descent(learning_rate=0.01, method=0):\n",
    "    # 随便取一个点，作为起始的更新点\n",
    "    x_origin = -8\n",
    "    \n",
    "    # 学习率\n",
    "    learning_rate = learning_rate\n",
    "    # 最大迭代次数\n",
    "    max_iter = 2000\n",
    "    # 阈值\n",
    "    threshold = 1e-5\n",
    "    \n",
    "    # 统计实际迭代次数\n",
    "    i = 0\n",
    "    # 每次更新的x保存下来\n",
    "    ret = []\n",
    "    \n",
    "    while True:\n",
    "        ret.append(x_origin)\n",
    "        # 更新参数\n",
    "        x_origin = x_origin - learning_rate * dx(x_origin)\n",
    "        i += 1\n",
    "        # 退出条件列出三种来\n",
    "        if method == 0:\n",
    "            # 第一种：达到最大迭代次数\n",
    "            if i > max_iter:\n",
    "                break\n",
    "        elif method == 1:\n",
    "            # 第二种：梯度小于阈值\n",
    "            if abs(dx(x_origin)) < threshold:\n",
    "                break\n",
    "        elif method == 2:\n",
    "            # 第三种：相邻两次的x值相差小于阈值\n",
    "            if abs(x_origin - ret[-1]) < threshold:\n",
    "                break\n",
    "    return ret"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "11732457-c636-4c2d-b384-513d2a3586ac",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "### 第一种情况：学习率过小"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "86aae8b6-3757-44d7-9cb4-5963a602dda5",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 把学习率设置成 0.001（此时学习率比较小）\n",
    "ret = gradient_descent(learning_rate=0.001, method=2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "95051a36-0429-42c6-86e0-d68d95263780",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3823"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 学习率过小，会导致迭代次数大幅增加\n",
    "len(ret)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "5f529504-eb63-49ec-9c64-fc0d96e1c4d6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAT8AAAFlCAYAAACds+86AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAAA22ElEQVR4nO3deXjV9Zn//+edPWQhCQkJkA0IW9gChCUoiOCCS8VabbUqTMs0nbHtMG3nR2u/M5ftTBd1bOu001rpaKvV2sVapYoKqIDKmpCwL4HsgZCdhISs5/3745xIikGSnHPyOcv9uC4ukvc5ybkTPC8/7/UjxhiUUsrfBFhdgFJKWUHDTynllzT8lFJ+ScNPKeWXNPyUUn5Jw08p5ZeCrC4AID4+3qSnp1tdhlLKx+Tn59cZYxL6e8wjwi89PZ28vDyry1BK+RgRKbvSY9rtVUr5JQ0/pZRf0vBTSvklDT+llF/S8FNK+SUNP6WUX9LwU0r5JQ0/pZRf0vBTSvklDT+llF/S8FNK+aWrhp+IPCsiNSJy+LL2r4nIcRE5IiKP92l/WEROicgJEbnZ1QUbY8gva+Rw1XlXf2ullIdq6+xm85Fqzl/sctn3HMiV32+BlX0bROR6YBUw2xgzHXjC0Z4J3AtMd3zNL0Uk0GXV2l+Df3mpgF9tP+3Kb6uU8mCF5U3k/i6fwooml33Pq4afMWYH0HBZ8z8DjxpjOhzPqXG0rwL+YIzpMMaUAKeABS6r1iErJcalvwSllGcrcLzfs5JjXPY9hzrmNxlYIiJ7RGS7iMx3tI8DKvo8r9LR5lJZKTFUNl6ktqXD1d9aKeWBCsqbmJAQwcgRwS77nkMNvyAgDlgE/H/An0REBvMNRCRXRPJEJK+2tnZQLz4nNQZAr/6U8gPGGAormshKiXHp9x1q+FUCrxi7vYANiAeqgJQ+z0t2tH2MMWaDMSbbGJOdkNDvQatXNGPcSIIChMKKxqFVr5TyGpWNF6m70MEcDwm/V4HrAURkMhAC1AEbgXtFJFRExgOTgL0uqPPvhAUHMnVMlF75KeUHet/nc1JjXfp9r3qMvYi8BCwD4kWkEngEeBZ41rH8pRNYY4wxwBER+RNwFOgGvmKM6XFpxQ5ZKTG8WnCGHpshMGBQPW6llBcprGgiNCiAKUlRLv2+Vw0/Y8x9V3jogSs8/wfAD5wpaiDmpMTywu5yTtdeYHKia38pSinPUVDeyMxxIwkOdO2eDK/d4ZHVO+lR3mRpHUop9+nstnH4TPNHk5yu5LXhN35UBNFhQRTopIdSPut4dTOd3TayUlw73gdeHH4BAcLslBgK9MpPKZ/V+/7O0iu/vzcnNZaT51po7ei2uhSllBsUVjQxOiqUsSPDXP69vTv8UmKwGThYqYccKOWLCsobyUqJYZB7KAbEq8Ovd8W3jvsp5XsaWjsprW9jbprrx/vAy8MvNiKECfER7C9rsroUpZSL9e7gcvXOjl5eHX5gH/crrGjEvsZaKeUr9pc1ERggzHLhSS59+UD4xVB3oZOKhotWl6KUcqGCikamjYkiPMSlR4J+xCfCD3TcTylf0mMzFJY3MccN6/t6eX34TUmMYkRIIPvLNPyU8hVFNS20dvYwNy3Gba/h9eEXFBjArOSRH530qpTyfr2Lm/XK7yrmpsZy9Ewz7V1uOUBGKTXM9pc1EhcRQtqoEW57DZ8IvzmpsXTbDIf0jm5K+YSCiibmuGlxcy8fCb8YwL4aXCnl3c5f7OJUzQW3LW7u5RPhFx8ZSmrcCF3srJQP+OjkZjctbu7lE+EHMDc1hvxyXeyslLfbX9ZIgMAsDb+BmZcWS21LB5WNuthZKW+2v7yRqUnRRIZe9aB5p/hM+PXe3GS/jvsp5bV6Fze7c31fL58Jv6lJuthZKW9XVNNCS0c389w82QE+FH5BgQFkpdjH/ZRS3infcfEyLzXO7a/lM+EH9sXOx8620NapJzsr5Y3yyxqJjwwhJS7c7a/lU+E3Ly2WHpvhQIUudlbKGxWUNzE3Ndati5t7+VT49S521kkPpbxP/YUOSupa3b64uZdPhV/MiBAmJkR8NG6glPIe+x2HGQzHZAf4WPiB/Re3Xxc7K+V19pc3EhwozBw3clhez+fCb25qLE1tXRTXtVpdilJqEPLLGskcO5KwYPec3Hw5nwu/3kvm/FLt+irlLbp6bBysbGJe6vB0ecEHw29iQiQjw4N13E8pL3LkTDPtXTay0z0o/ETkWRGpEZHD/Tz2TRExIhLv+FxE5GcickpEDorIXHcU/UkCAoR5abHklTUM90srpYYor9T+fh2uyQ4Y2JXfb4GVlzeKSApwE1Dep/kWYJLjTy7wlPMlDt68tFhO17bS2NppxcsrpQYpv6yR5NhwEqPDhu01rxp+xpgdQH+XUT8F1gN9p1VXAc8bu91AjIiMcUmlg/DRuJ92fZXyeMYY8soayR7Gqz4Y4pifiKwCqowxBy57aBxQ0efzSkfbsJqdHENQgJCn4aeUx6touEhtSwfz0t2/n7evQR+YJSIjgO9g7/IOmYjkYu8ak5qa6sy3+pjwkECmjxupJ7wo5QV6x+e94cpvIjAeOCAipUAysF9EkoAqIKXPc5MdbR9jjNlgjMk2xmQnJCQMoYxPlp0Wy4HKJjq7bS7/3kop18krayQqNIjJiVHD+rqDDj9jzCFjzGhjTLoxJh1713auMaYa2Aisdsz6LgLOG2POurbkgclOi6Wj28bhM3rIgVKeLL+0kTlpsQQGuP8wg74GstTlJWAXMEVEKkVk7Sc8fRNQDJwCfg085JIqh2Beui52VsrTnb/YxcmalmHv8sIAxvyMMfdd5fH0Ph8b4CvOl+W80VFhpMaNIK+sgS8xwepylFL9sO/DH/7xPvDBHR59ZafFkl+mhxwo5anySxsJDBBmu/lObf3x7fBLj6PuQiel9W1Wl6KU6se+0gamj40mws13auuPT4fffMe4375S3eqmlKfp7LZRWNFEdtrwru/r5dPhlzE6ktgRwR/tG1RKeY7DZ87T0W1jwfjhH+8DHw8/EWFeWhz7dMZXKY9z6TADvfJzi/npsZTUtVLb0mF1KUqpPvaVNjI+PoKEqFBLXt/nwy/bsV8wX4+4UspjGGPIK22wZIlLL58Pv5njRhIaFKBdX6U8yOnaCzS2dTF/mA8z6Mvnwy8kKICslBid8VXKg/RejMwfr+HnVvPT4zhyppnWjm6rS1FKYV9+Fh8ZQvqoEZbV4Bfhl50eS4/NUFjRZHUpSikgr7SR7LQ4RIb3MIO+/CL85qbFEiCwp0S7vkpZ7VxzO+UNbcN6s6L++EX4RYcFM21MNPs0/JSyXO9FyMLxoyytwy/CD+zjfgUVjXq4qVIW21fSQERIINPGDO/hpZfzm/BbOD6O9i4bh6r0cFOlrLS3pIF56XEEBVobP34Tfr2LnXXJi1LWaWrr5MS5FhZYPN4HfhR+CVGhTEiIYK+O+yllmd71fQssHu8DPwo/gAXpcewrbaDHpoebKmWFvSX1hAQGMCt5pNWl+Fn4jY+jpb2bE9UtVpeilF/aW9pIVkoMYcGBVpfif+EH9v/7KKWGV2tHN4erzn/0PrSaX4VfcuwIxo4M00MOlLJAQXkTPTZj6X7evvwq/MB+9benpEFvaqTUMNtbUk+AwDwLj7Hqyw/DbxR1Fzoormu1uhSl/Mrukgamjx1JpAU3K+qP34Xfwgn2S+49xbrkRanh0t7VQ2FFEws9pMsLfhh+E+IjiI8MZY9Oeig1bAormujstrFwgvXr+3r5XfiJCAsnxLGnWMf9lBoue4obELGvtfUUfhd+AIvGx1HtOFZHKeV+e0rqmZoUzcgRwVaX8hG/DL/eS28d91PK/Tq7bewvb2TRBM+56gM/Db9JoyOJiwhht477KeV2ByubaO+yWX5+3+WuGn4i8qyI1IjI4T5t/y0ix0XkoIj8VURi+jz2sIicEpETInKzm+p2ioiwID1Or/yUGga9h5d6ys6OXgO58vstsPKyti3ADGPMLOAk8DCAiGQC9wLTHV/zSxGxfhNfPxZOiKOq6SKVjTrup5Q77S6uZ0piFHERIVaX8neuGn7GmB1Aw2Vtm40xvbdC2w0kOz5eBfzBGNNhjCkBTgELXFivyyxyjPvpEVdKuU9Xj438ssaP1td6EleM+X0ReNPx8Tigos9jlY42jzMlMYqYEcHsLtZxP6Xc5VDVedo6ezxuvA+cDD8R+X9AN/DiEL42V0TyRCSvtrbWmTKGJCDAPu63W8f9lHKb3osLn7ryE5F/AG4H7jeXVgtXASl9npbsaPsYY8wGY0y2MSY7ISFhqGU4JWfiKMob2qhqumjJ6yvl63YXNzA5MZL4yFCrS/mYIYWfiKwE1gN3GGP6zhhsBO4VkVARGQ9MAvY6X6Z79I777T6tXV+lXK2rx0ZeacNH7zNPM5ClLi8Bu4ApIlIpImuB/wWigC0iUigivwIwxhwB/gQcBd4CvmKM6XFb9U6akhhF7Ihgdum4n1Iud7DSPt6X46Hhd9WzZYwx9/XT/MwnPP8HwA+cKWq4BAQIC8eP0kkPpdzg0nifZ4afX+7w6Ctn4igqGy9Soft8lXKp3cX1TE3yvPV9vfw+/D4a99OrP6VcprPbRl5po8eO94GGH5MTI4kLEXa9tg127bK6HKV8wsHKJi529Wj4eTLZvZtFhz9kd303ZskS2LDB6pKU8nq7Ttcjgked3Hw5vw8/nn+enNJCzkSPpjwqAf75n/UKUCkn7S6x7+eN9dDxPtDwAyCn7CAAu1Jngc0Gzz9vcUVKea/2rh7yShu5JiPe6lI+kYbf6tVMbKxidEs9O9Nm2duqq62tSSkvVlDeREe3jcUTPXe8DzT8ICcHWbKExeUH2Zk6G72rh1LO2XW6jsAA8bjz+y6n4QcQF8fisoPURcZyalQKlJZaXZFSXuvD0/XMHDeSqDDPuV9HfzT8AJKSyCk7AMDOtNlQWKizvkoNwYWObg5UNHl8lxc0/OxWryaluYaUpmp2pjrG/Z654g4+pdQV7CttoNtmWDzRsyc7QMPPLicHsrJYXHaA3akz6ZEACAuzuiqlvM6u0/WEBAYwLy3W6lKuSsOvV3o6i8sOcj48imOjx0Nzs9UVKeV1dp6uY05qDOEhHnnrnr+j4dcrKYmccvt6v51ps3TcT6lBamrr5MiZZq/o8oKG3yWrVzO6tZGMunI+SMuyt+m4n1IDtru4HmNgcYbnT3aAht8ljnG/a0sL2Zc8nc6AIOjstLoqpbzGB6fqiAgJJCslxupSBkTDr69Fi1hcdoCLIWEUjJ0CBw7oPl+lBmjnqXoWThhFcKB3xIp3VDlcVq9mUcVhAmw9fJieBcbA449bXZVSHq+q6SLFda1esb6vl4ZfXzk5RI9JYPbZIj5Iz7K3nThhaUlKeYMPT9UBcO0k75jsAA2/j0tN5dqyQg6MmUxLSDh0d1tdkVIeb+epOuIjQ5iSGGV1KQOm4Xe5zEwWlx6gJyCQPSkzoahIl7wo9QmMMXxwqp5rMuIREavLGTANv8utXs3cM8cI62q/1PXVJS9KXdHJcxeou9Dh8ef3XU7D73I5OYTOnMGCiiN8mD7b3qZLXpS6ot7xPg0/X5CezjVlByiKT+NcZJwueVHqE3x4qo7x8RGMiwm3upRB0fDrT1IS15QWAth3exijR9sr1Y+uHhu7i+u5xkt2dfSl4def1avJrC1lVGvTpXE/PdpeqY8pKG+itbOHJZMSrC5l0DT8+pOTQ8DsWVxTVsj76XPsR9vr6c5Kfcz7RbUEBgg5XrS4uZeG35WEhLCkpIC6yFiOJ6TruJ9S/Xi/qI6slBiiPfzI+v5o+F3J2rUs6R33S5+j435KXeZ8WxcHK5u41stmeXtdNfxE5FkRqRGRw33a4kRki4gUOf6OdbSLiPxMRE6JyEERmevO4t0qN5ekMXFk1JWzY/wce9vRo9bWpJQH2Xm6DpuBJV60pa2vgVz5/RZYeVnbt4F3jDGTgHccnwPcAkxy/MkFnnJNmRYJCmJJaQF7k6fTHhgMZWVWV6SUx9hRVEdUaBCzveQIq8tdNfyMMTuAhsuaVwHPOT5+DrizT/vzxm43ECMiY1xU6/CbMoUlJQV0BIeSl5xpDz8d91MKYwzvF9WyaKL3HGF1uaFWnWiMOev4uBpIdHw8Dqjo87xKR5t3Wr+ehRWHCe7p4v10R9dXj7hSirL6NiobL7LUS7u84IIJD2OMAftqkMEQkVwRyRORvNraWmfLcI+cHCLGJTG36jjv9477FRRYW5NSHuD9Ivt79lovXN/Xa6jhd663O+v4u8bRXgWk9HlesqPtY4wxG4wx2caY7IQED/4FpqaytGQ/RxMnUjsiBsrLteur/N72k3WkxIWTPmqE1aUM2VDDbyOwxvHxGuC1Pu2rHbO+i4DzfbrH3ikzk+tK9gPYr/50yYvyc53dNnadrmPppASvOsLqcgNZ6vISsAuYIiKVIrIWeBS4UUSKgBscnwNsAoqBU8CvgYfcUvVwWr2azJoSRrU2sX38PHubbnVTfiy/rJHWzh6WTvbgHtsABF3tCcaY+67w0Ip+nmuArzhblEdxbHVbWrKf7RPmYUMI0K1uyo/tKKolKEC86n4d/fHOOerhFhLC0pL9NIwYyeGkifYbmuu4n/JT20/UMjctligv3NLWl4bfQKxdy5JS+yzvjvGOTSu65EX5odqWDo6ebeY6L+/ygobfwOTmEh8dzozqU5fCT5e8KD/Uu8RFw8+fTJ7M0pL95I+bRnPICF3yovzS9pO1jIoIIXNMtNWlOE3Db6AyM1lasp+egEB2ps/WJS/K79hshg+K6lgyKZ6AAO9d4tJLw2+gVq9mXtUxIjvaLi150VNelB85VHWe+tZOrpvi/V1e0PAbuJwcglNTuLa0gG0T5tn38+kpL8qPbDtRiwgs9eItbX1p+A1GairLivM5G53Ayfg0HfdTfmXbyRpmJccwKjLU6lJcQsNvMDIzua4kH4D3JmTruJ/yGw2tnRRWNLHMB2Z5e2n4Dcbq1YxpqWdqTQnbJui4n/If7xfVYgws85HxPtDwG5ycHEhPZ1lxHnnJmbSEhMPJk1ZXpZTbbTtRS+yIYGYlx1hdisto+A1WVhbLivPpDgziw7Qs+yEHGzZYXZVSbmOzGXacrOW6yQkE+sASl14afoO1fj3zqo4R1dHK9t6u7zPPWFuTUm7Uu8Rl2ZTRVpfiUhp+g5WTQ/DECVxbWnhpyUtjo9VVKeU2vUtcvPUubVei4TcUsbFcfzqPs9EJ9huaFxXpkhfls949UcNsH1ri0kvDbyjWrmVZ8T4A3p04396mp7woH1Tb0sGBiiaWT/WtLi9o+A1Nbi6jo8KYdfbkpfA7ccLampRyg20n7Lfn0fBTlyQlcf3pPArGTqEhPBpaWqyuSCmXe+9EDYnRoUwf6/2nuFxOw2+oQkJYfnoftoBAto+fC5WVuuRF+ZTObhvvn6zj+imjvfpGRVei4TdUa9cys/oU8RcaL3V9dcmL8iF5pQ20dHRzvQ92eUHDb+hycwkYN5bri/PYPmEe3RKgS16UT3n3eA0hgQFcm+FbS1x6afg5Y9w4lp/eR3NYJPnjpumSF+VT3j1Rw8IJcUSEXvUmj15Jw88Za9dybWkBwT1dvJuxwN6mS16UDyita6W4ttUnZ3l7afg5IzeXqMhwFlYcZmtv+OmNjZQP2HrsHAA3TEu0uBL30fBzVnQ0NxTt4fSoFEpix+qSF+UTth47x5TEKFLiRlhditto+DkrK4sVp/YC8E7GAmho0CUvyqudb+tiX2kjK6b5bpcXNPyct349Kc01TKktZetER9f3hz+0tialnLDtZA09NsMNmb7b5QUNP+fl5EBSEjcU7WFfynTOh0bYb2yks77KS209VkN8ZAhZPnRwaX80/Fxh0SJWnN5LT0Ag2yZk29v03h7KC3X12Nh2ooblU0f7xL15P4lT4SciXxeRIyJyWEReEpEwERkvIntE5JSI/FFEQlxVrMdav56sMyeJb228NOur9/ZQXmhfSQMt7d2s8OFZ3l5DDj8RGQf8C5BtjJkBBAL3Ao8BPzXGZACNwFpXFOrRcnIISEpk+el9bJswj66AQL23h/JKW46dIyQowOcOLu2Ps93eICBcRIKAEcBZYDnwsuPx54A7nXwN7xAXxw1Fe2gJi2RPygz7vT103E95EWMMW46e49qMeEaE+Oaujr6GHH7GmCrgCaAce+idB/KBJmNMt+NplcA4Z4v0CuvWsaS0kLCudrZMWmRv090eyoscr26hsvEiN/n4LG8vZ7q9scAqYDwwFogAVg7i63NFJE9E8mpra4dahufIzSU8OoKlJQVsnrTIfm+PHTusrkqpAdt85Bwi+MV4HzjX7b0BKDHG1BpjuoBXgGuAGEc3GCAZqOrvi40xG4wx2caY7IQEH7kRclISNxXt4mx0AocTJ+qCZ+VVNh+tZm5qLAlRvnWvjitxJvzKgUUiMkLsJx2uAI4C7wF3O56zBnjNuRK9yLp1LD+dR4Cth82Tc+xtTz5paUlKDURV00WOnGn2my4vODfmtwf7xMZ+4JDje20AvgV8Q0ROAaMA/znhMzeXuPAg5lceZUvGQnubnvGnvMCWI9UA3KjhNzDGmEeMMVONMTOMMQ8aYzqMMcXGmAXGmAxjzD3GmA5XFesVZszgpqJdHB89nrKYJJ31VV5hy7FzZIyOZEJCpNWlDBvd4eFqmZncVLQHgM2THF1fnfVVHux8Wxe7ixv8qssLGn6ut3o1KefPMe1cMZt7l7zs3m1tTUp9gneOn6PHZvyqywsafq7nOOhg5cmd5CVPoyYiRru+yqO9dbiaMSPDmO3jBxlcTsPPHRYtYuXJXRgJYEuGLnhWnquts5vtJ2u5eXqSzx9kcDkNP3dYv57JdWWMb6jirSmL7W0nTlhbk1L92Hailo5uGzdPT7K6lGGn4ecOOTnIpEncfHInu1Jn2c/40+PtlQd663A1cREhzE+PtbqUYafh5y6xsaw8uYvuwCD78faVlbrbQ3mUju4e3j1ew02ZiQQF+l8U+N9PPFzWrmXW2SLGNNfy1mRH11d3eygPsvNUPRc6url5hv91eUHDz31ycwmIiuTmk7vYPn4urcFh9qs/pTzEW4eriQoNYvHEUVaXYgkNP3dKSeHmk7voCA5l24R59nE/7foqD9DVY2Pz0WqWTxtNaFCg1eVYQsPPndatY0HlEeJbG9k09Vp7m3Z9lQfYXVxPY1sXt84cY3UpltHwc6fcXAIjI7j55C7enTCfi0Gh2vVVHmHToWoiQgK5brKPHCc3BBp+7paSwm3HP+BiSJh2fZVH6O6x8faRapZPSyQs2D+7vKDh537r1rGg4jCjWpt4Q7u+ygPsKWmgobWT22b65yxvLw0/d8vNJSgygpuKdvHuxPm0B4Vo11dZatOhs4QHB3Ld5NFWl2IpDb/h4Oj6toWEs228dn2VdXpsxtHlHU14iP92eUHDb3isW8ei8kPEtp1n09Rr7G3a9VUW2FNST92FTm7z41neXhp+w8HR9V15chdbMxbaZ33LyqyuSvmhNw7au7zLpvjvLG8vDb/hkpLCp47toC0knPcmZkNbG3zrW1ZXpfxId4+NNw9Xc0Nmol/clPxqNPyGy7p1LKw4TPyFRv42bam97dlnra1J+ZWdp+tpaO3k9lna5QUNv+GTm0tgeBi3nfiAdydkcyEk3H71p9Qw+duBM0SFBvn1wua+NPyGU3o6tx97n47gULZmLLSHn876qmHQ2W1f2HzjdP9e2NyXht9wWreOeVXHGNNcy+tTl9jbdNZXDYP3i2ppbu/mU7PGWl2Kx9DwG06OY65uO/4B2yfMtZ/wrLO+ahj87cAZRoYHc01GvNWleAwNv+HmmPXtCgy2399DZ32Vm13s7GHL0XOsnJ5ESJC+5Xvpb2K4rVvHrOoi0hrPsHHadfa2p5+2tibl0945fo7Wzh5WzdEub18afsMtNxeJimLV0W3sTJvFucg4OH9e7+ur3ObVgjMkRoeycLx/nth8JRp+VlixgjuO7sBIAH/rnfj49retrUn5pKa2TrafrOFTs8YS6Gf35b0aDT8rrF9PRkMlM6pPsTHT0fXdv9/ampRPevNwNV09hjvnjLO6FI/jVPiJSIyIvCwix0XkmIjkiEiciGwRkSLH3/53Q9CrycmBuDhWHd3OwTGTKY4dCxcuaNdXudxrhVVMSIhg+thoq0vxOM5e+f0P8JYxZiowGzgGfBt4xxgzCXjH8bm63NKlfOrYDsTYeC1zmb1Nu77Khc6ev8iekgZWzR6HiHZ5Lzfk8BORkcBS4BkAY0ynMaYJWAU853jac8CdzpXoo9avJ+lCPYvKD/Fa5jIMwL59VlelfMjGwjMYA6uydJa3P85c+Y0HaoHfiEiBiPyfiEQAicaYs47nVAOJzhbpk3JyICmJTx/ZRmncWArGToGLF3W7m3KZvxZUMSc1hvT4CKtL8UjOhF8QMBd4yhgzB2jlsi6uMcaA/aLmciKSKyJ5IpJXW1vrRBle7Hvf45YTHxDa1cFfp19vb/vhD62tSfmEo2eaOV7dwl060XFFzoRfJVBpjNnj+Pxl7GF4TkTGADj+runvi40xG4wx2caY7IQEPz1lIjeXKHq4qWg3f5u2lM6AIDhzxuqqlA94ZX8lwYHC7bqX94qGHH7GmGqgQkSmOJpWAEeBjcAaR9sa4DWnKvR1Y8dy15H3aAqPth9y2tWl292UU7p7bLxaeIbrp4wmNiLE6nI8lrOzvV8DXhSRg0AW8EPgUeBGESkCbnB8rq7k4YdZUrKf+NbGS11f3e6mnPDBqTrqLnRw19xkq0vxaE6FnzGm0NF1nWWMudMY02iMqTfGrDDGTDLG3GCMaXBVsT4pN5eg8DDuOLqddzIW0BQWqdvdlFNe2V/FyPBgrp/qp8NJA6Q7PDxBejp3HX6XrsDgS9vdHn/c2pqUV2pp72Lz0WpunzWG0CA9tPSTaPh5gnXrmF5TzNSaEl6eeYO9bccOa2tSXumNg2dp77Jx9zzt8l6Nhp8nyM1FwsO5+9BWDoydQtGoFGho0K6vGrQ/51eSMTqSrJQYq0vxeBp+nmL+fO48uo2gnm7+3Hv1p9vd1CCcrr1Aflkjd89L1u1sA6Dh5ykefZT4tvNcf3ofr0xfTldAIOzebXVVyou8nF9JYIDowuYB0vDzFDk5EBnJPYe2UhcZy47xc6GzU7e7qQHpsRle2V/JdZMTGB0dZnU5XkHDz5M89BDXF+cR39p4qev7yCPW1qS8wvtFtZxr7tCJjkHQ8PMkjz1GcIBw55FtvJOxgLoRI6G6Wic+1FX9Oa+SmBHBrJg22upSvIaGn6dJTuZzBzfTFRjMX6cvt7fpxIf6BPUXOth8tJq75iTr2r5B0PDzNA8/zKT6CuZVHuUPs2/Sc/7UVf21oIquHsPn5qdYXYpX0fDzNLm5EBXF5w5u5vSoFPLGZeo5f+qKjDG8tLecOakxTEmKsrocr6Lh54lWrOD24+8T2dHGH2bfZG/TiQ/Vj/yyRk7XtnLf/FSrS/E6Gn6eaP16RnR1cMfR7bwx9VqaQ0boxIfq1x/2VRAREshts8ZYXYrX0fDzRI4j7u89+DbtwWG81nt7S534UH00t3fxxsGz3JE1jojQIKvL8Toafp7qe99jZvUpMs+d5vdZt9gnPnTHh+rj1YIqLnb1cK9OdAyJhp+nys1FQkK4v+BNjiVOsN/gSHd8KAdjDC/uLmfmuJHM1kMMhkTDz5MtWsSqY9uJ6Gjjhaxb7W068aGwT3ScONfC/Qt1omOoNPw82aOPEtl5kU8feY/Xpy2xn/KsEx8KeHFPOVGhQdyh9+QdMg0/T+aY+Ph84Vt0BoXw8owV9nad+PBrDa2dvHHoLHfNHceIEJ3oGCoNP0/3ve+RWVvC3KpjlyY+du60uiplob/kV9LZbePzC9OsLsWrafh5utxccEx8FI9K5sO02dDdrbe39FM2m+GFPWXMT4/VHR1O0vDzBosWcdvx94lrO89zc2+3t/3sZ9bWpCyx/WQtZfVtrM5Jt7oUr6fh5w0efZSwni7uK3yLdzIWUBE9GtrbddmLH/rtzlJGR4WyckaS1aV4PQ0/b5CTA7Nnc3/hmwC8MEeXvfijkrpWtp+s5f6FaQQH6lvXWfob9BZPPcXYljpuKtrNH2ffRHtQiC578TO/21VGcKBw30Ld0eEKGn7ewnGPjzX5r9MUHs3Gabrf15+0dnTz57wKbp05htFReo8OV9Dw8yYPPcSiikNMqS3lN/M+ZV/28uGHVlelhsEr+ytp6ejWiQ4X0vDzJo89hgQG8oW8jRxLnMCu1JnQ06PLXnyczWZ49sNSZqfEMDc1xupyfIaGn7e5917uPLqNuLbzPJt9p73tySetrEi52Xsnaiipa2XtteP1ZuQu5HT4iUigiBSIyOuOz8eLyB4ROSUifxSREOfLVB954QXCerp4oGAT72TMpyR2rJ724uOe+aCEMSPDuEWXt7iUK6781gHH+nz+GPBTY0wG0AisdcFrqL5mzeKBgjcI7unhN/PusLc9/LC1NSm3OHqmmZ2n61mzOF2Xt7iYU79NEUkGbgP+z/G5AMuBlx1PeQ6405nXUP146ilGtzbxqWPb+fPMGzgfGgENDbrsxQc9+2EJ4cGBeo8ON3D2fyVPAusBm+PzUUCTMabb8XklMM7J11CXy8mB8HDW7nuNiyFhvJh1i739oYesrUu51Lnmdl4rrOKe7GRGjgi2uhyfM+TwE5HbgRpjTP4Qvz5XRPJEJK+2tnaoZfivr32NzNoSlpTs5zfZd9AeGAyFhVZXpVzo2Q9L6LEZ/vHaCVaX4pOcufK7BrhDREqBP2Dv7v4PECMivYeMJQNV/X2xMWaDMSbbGJOdkJDgRBl+6rHHIDiYf9rzF2oj43h1+vX29gcesLYu5RLN7V38fnc5t84cQ+qoEVaX45OGHH7GmIeNMcnGmHTgXuBdY8z9wHvA3Y6nrQFec7pK1b+vf53FZQeYXn2KDQs+jQ2BF1+0uirlAi/tKaelo5svL51odSk+yx3TR98CviEip7CPAT7jhtdQYF/0HBDAl/e+QvGoFLZmLLC369WfV+vstvHshyUsnjiKmckjrS7HZ7kk/Iwx24wxtzs+LjbGLDDGZBhj7jHGdLjiNdQV3Hcftx7/gOSmap5adI99y5te/Xm1VwurONfcwZev06s+d9KFQ97uhRcIwvDlva9QMG6qfcsb6NWfl+qxGZ7adprMMdEsnRRvdTk+TcPPF8yaxT0Ht5BwoYFf5HzO3vb731tbkxqSTYfOUlLXyleXZ+hWNjfT8PMFTz1FWE8XX9r3Vz5Mz6JgzGQwRg888DLGGH7x3ikmJkSwcrpuZXM3DT9fkJMDGRncX/AmMRebL139/eQn1talBuWdYzUcr27hoWUZBAToVZ+7afj5iuefJ6KrnS/mbWTrpIUcTRivd3nzIsYYfv7eKZJjw/VG5MNEw89X5ORAXBxr8v9GVPsFfnbNvfZ2vfrzCttP1nKgool/XjZRDzAYJvpb9iU/+hEjO1r5Yt5G3ppyDUdG69WfNzDG8NOtRYyLCeeeeXp/juGi4edLcnMhOpov5r1GVPsFnrzm8/b2J56wti71ibadsF/1fXV5BiFB+pYcLvqb9jX//d+M7GjlH/e9ypbJORxOnAg2m67781D2q76TJMeGc/e8ZKvL8Ssafr4mNxcSEvhC3kai+1796bo/j/Tu8RoOVp7na8szdKxvmOlv2xe99hrRnW3k7n2FrZMWsn/sFF3354FsNsMTm0+SNmoEd83Vq77hpuHnixwzv1/I20h8ayOPL11j3/P7+ONWV6b6+NvBMxw728w3bpysV30W0N+4r/rRj4joauerO//I7rRZvJ8+x95+883W1qUA6Oqx8ZMtJ5maFMWnZum6Pito+Pmq3FxIS+O+A28x7vw5Hr9ujf28v82bra5MAX/cV0FZfRvrV07R3RwW0fDzZaWlhPZ08433X+RwUgabpl5jb8/MtLYuP3exs4efvVPE/PRYrp8y2upy/JaGn6+76SbuPLqNKbWlPL50DR2BQXDsmN7pzUK/fr+YmpYOvrVyqp7cYiENP1/39tsEGhvfee9ZymPH8Ls5t9nbb73V2rr8VE1zO7/afppbZiSRnR5ndTl+TcPPH9x/P9eV7GdpcT4/X3wvTWGR0NQEGzZYXZnf+cmWk3T12PjWyqlWl+L3NPz8wQsvgAjfee9ZWkJH8PPFjkMP9D6/w+p4dTN/yqvgwUXppMdHWF2O39Pw8xef/zxT68r47KGtPD/3Nopjx0JPj257GybGGH7wxjEiQ4P4lxUZVpej0PDzHy+8AEFBfHPH7wjr7uQ/V+TqzY6G0eaj53i/qI5v3DiZmBEhVpej0PDzL7/4BQltTaz74Pdsm5jNuxPn29sXLrS2Lh/X3tXDf71+lCmJUTywKM3qcpSDhp8/yc2FmBjW7H+djLpy/nPFl2gPDIa9e3Xpixtt2FFMZeNFvnvHdIJ0G5vH0H8Jf7NpE8G2Hh55ZwNlsWP5vwWftrcvW2ZpWb6qsrGNX247xW2zxpAzcZTV5ag+NPz8TU4OTJvGktJCbjnxIT/P+RzlIxOhs1MnP1zMGMMjrx0hQITv3DrN6nLUZTT8/NHRowA8snUDwbYe/v2mh3Tyww3ePlLNO8dr+MaNkxkXE251OeoyGn7+av16ki7U8287nmfHhHm8PnWJvX2Uds1coaW9i0c2HiFzTDT/sDjd6nJUPzT8/NVjj0FcHA8WbGLW2ZN8b0Uu50MjoKFBDz11gR9vPklNSwc/vGumTnJ4KP1X8Wf19QQaGz98639pHBHN95f/o71dDz11yr7SBp7bVcqDi9LISomxuhx1BUMOPxFJEZH3ROSoiBwRkXWO9jgR2SIiRY6/Y11XrnK5m25iRk0x/7T7Zf4860bemzDP3j5mjLV1eamLnT2sf/kg42LCdf+uh3Pmyq8b+KYxJhNYBHxFRDKBbwPvGGMmAe84Plee6u23ISCAf9n5EpPqynh45ddoDhkB1dXa/R2Cn2w5QUldK49/ZhYRoUFWl6M+wZDDzxhz1hiz3/FxC3AMGAesAp5zPO054E4na1Tu9tRThPZ088QbT1ITEcv3V2j3dyjyyxp45oMSPr8wlcUZ8VaXo67CJWN+IpIOzAH2AInGmLOOh6qBRFe8hnIjx5H3s6uL+Kc9f+FPs27i7UmL7I9FR1tbm5e40NHN1/94gLEx4Tx8i3Z3vYHT4ScikcBfgH81xjT3fcwYY8C+hKyfr8sVkTwRyautrXW2DOWs0lIQ4V8/+D0zqk/x7ZVfoyYiFlpadPHzAHx34xEqG9v46eeyiAoLtrocNQBOhZ+IBGMPvheNMa84ms+JyBjH42OAmv6+1hizwRiTbYzJTkhIcKYM5Sq/+hUhtm6e/NsTXAwO5d9u/Vdd/DwAmw6d5eX8Sh5alsF8PZ3Zazgz2yvAM8AxY8xP+jy0EVjj+HgN8NrQy1PDytH9zWio5P+99yw7Jszjmfl32h8L0FVR/alsbOPhVw4xO3kk626YZHU5ahCc+S/6GuBBYLmIFDr+3Ao8CtwoIkXADY7PlbcoLYXAQB4o2MTNJ3by6HX/QP7YqWCM7v64TGe3ja/8vgCbzfCz++bojce9jDOzvR8YY8QYM8sYk+X4s8kYU2+MWWGMmWSMucEY0+DKgtUw6O5GgMff/B/GtNTx1VXfoiE82r77Q8f/PvKjN49xoKKJx++eRdooPZbe2+j/qlT/7r+fkR2t/PLVH1E/Ioav3/4NeiTAPv6nZ/+x6dBZfvNhKV+4Jp1bZuqCcG+k4af698ILEBXFzHOneWTr02yfkM0TSx60P7Z4sbW1WezY2Wa++acDzEmN4eFb9Kgqb6VL0NWVNTeDCPcfeIsjiRN5KuceptaWsOrYDhCxjwP6mYbWTr70fB4jw4N5+oF5hATp9YO30n859ckcAffdrU+zoOIw629Zx8Ekx93HQvzrRjyd3TYeejGfmpYOnn5wHqOjw6wuSTlBw09d3dNPE2Lr5pev/oj4tia++JlHqBiZCF1dfrMDxBjDt/5ykN3FDTz2mZnM1tNavJ6Gn7q63FyYNo34tvM89+dH6AoMYs0936UxLMq+AyQ93eoK3e6JzSf4a0EV37xxMp+ek2x1OcoFNPzUwBw9CqGhZNRX8utXvk/lyCS+9Jl/py04FMrKfPr2l7/bXcYv3jvNfQtS+OpyveG4r9DwUwPX3g7AgsojPPn6E+wfO5Xcu/790u0vfTAAX86v5D9ePcyKqaP5r1UzsG9sUr5Aw08NjmMC5NYTH/L4m//DB+lzeOjOh+kMCPK5APzbgTOsf/kA12bE84v75+px9D5G/zXV4DkC8O7D7/L9t3/BuxkLeOjOhy9dAWZmWlyg8zYeOMPX/1hIdlocG1bPIyw40OqSlItp+KmhcQTgA4Vv8l+bf8nWSQv54t3fpTU4DI4d8+pZ4Jf2lrPuDwXMTYvlmX/IZkSILof1RRp+augcAfhgwSZ+/PpP2J06gwc+9337PuCWFvtCaC9ijOHp7ad5+JVDXDc5gee+sEDP5vNhGn7KOY4A/MyRd/nlq49yJHECn37wCU7HjbM/7iUB2NVj4zt/PcyP3jzObbPGsOHBbMJDtKvryzT8lPMcAbiyaBcvvfQdLoSM4NMP/pgP02bbHw/07BBpauvkC7/Zx0t7y3lo2UR+fu8c3bbmB/RfWLmGIwDnnTnOq7/7JokX6nnws//Jzxbfi83muXuAC8obue1nH7CnpJ7H757F+pVTCQjwjqtV5RwNP+U6jgBMOX+OV5//Jncc28FPljzAms9+j3PN7RYX9/dsNsP/vV/MZ5+2H8/1539azGezUyyuSg0nDT/lWsZAVBQRXe389PUf86O3/5e9k7K58SfbeTm/EuMBJ8EU117gs0/v4vtvHGPZlNFs+pclZOleXb+jc/jK9ZrtN/ET4D5gUV0r618+wL/9+QCvFVbxH7dnMjkxatjLutjZw4Ydxfxy2ylCgwL48T2zuWvuON214afEE/5PnJ2dbfLy8qwuQ7mRzWZ4flcpP95ykrbOHj6/IJWvLc8YlmOhuntsvFZ4hic2n+Ds+XZunZnEI5+aTqIeSeXzRCTfGJPd72Mafmo4NbR28uTWk7y4p5xAET4zL5kvL51Aerzr74HR3tXDy/mVPL3jNBUNF5kxLpr/uC2ThRP0Rkz+QsNPeZzSulae3lHMX/Ir6eyxsXB8HPdkp3BjZiIjw4e+sLjHZiisaOTl/CpeP3CGlo5uZqfE8NCyidw4LVFncv2Mhp/yWDXN7fwpr4KX8ysprW8jMECYlxrLtZPimTluJJljoxkdFXrFcbmLnT0cr27m6Nlm9pY0sONkLY1tXYQFB3DrjDF8dn4KC8fH6bien9LwUx7PGMP+8kbePV7D9pO1HK5q/uixsOAAEqJCiRsRQkCAYAy0dnRTe6GDprauj54XHxnC0skJXDc5geVTR+vWNKXhp7xPS3sXx862cPTMeaqaLlLb0kFDW9dHS2XCgwMZHR1KYlQYk5OiyBwTTXJsuF7hqb/zSeGnS12UR4oKC2bB+DgWjI+zuhTlo3SRs1LKL2n4KaX8koafUsovafgppfyS28JPRFaKyAkROSUi33bX6yil1FC4JfxEJBD4BXALkAncJyLef1cbpZTPcNeV3wLglDGm2BjTCfwBWOWm11JKqUFzV/iNAyr6fF7paPuIiOSKSJ6I5NXW1rqpDKWU6p9lEx7GmA3GmGxjTHZCQoJVZSil/JS7wq8K6HsmeLKjTSmlPIK7wm8fMElExotICHAvsNFNr6WUUoPmlr29xphuEfkq8DYQCDxrjDnijtdSSqmhcNvBBsaYTcAmd31/pZRyhkccaSUitUDZIL8sHqhzQzlW8JWfxVd+DtCfxVMN9mdJM8b0O6PqEeE3FCKSd6VzuryNr/wsvvJzgP4snsqVP4vu7VVK+SUNP6WUX/Lm8NtgdQEu5Cs/i6/8HKA/i6dy2c/itWN+SinlDG++8lNKqSHzqvATkXtE5IiI2EQk+7LHHnacHXhCRG62qsahEJHvikiViBQ6/txqdU2D5UvnN4pIqYgccvxbeNVtBUXkWRGpEZHDfdriRGSLiBQ5/o61ssaBuMLP4dL3iVeFH3AYuAvY0bfRcVbgvcB0YCXwS8eZgt7kp8aYLMcfr1oc7qPnN17v+LfwtiUiv8X+Hujr28A7xphJwDuOzz3db/n4zwEufJ94VfgZY44ZY07089Aq4A/GmA5jTAlwCvuZgmp46PmNHsIYswNouKx5FfCc4+PngDuHs6ahuMLP4VJeFX6f4KrnB3qBr4rIQcflvsd3Sy7jC7//vgywWUTyRSTX6mJcINEYc9bxcTWQaGUxTnLZ+8Tjwk9EtorI4X7+ePWVxFV+rqeAiUAWcBb4sZW1Kq41xszF3o3/iogstbogVzH25R3eusTDpe8Ttx1sMFTGmBuG8GUef37gQH8uEfk18Lqby3E1j//9D4Yxpsrxd42I/BV7t37HJ3+VRzsnImOMMWdFZAxQY3VBQ2GMOdf7sSveJx535TdEG4F7RSRURMYDk4C9Ftc0YI7/IHt9GvvEjjfxmfMbRSRCRKJ6PwZuwvv+PS63EVjj+HgN8JqFtQyZq98nHnfl90lE5NPAz4EE4A0RKTTG3GyMOSIifwKOAt3AV4wxPVbWOkiPi0gW9u5IKfBlS6sZJB87vzER+KuIgP398XtjzFvWljRwIvISsAyIF5FK4BHgUeBPIrIW++lJn7WuwoG5ws+xzJXvE93hoZTyS77S7VVKqUHR8FNK+SUNP6WUX9LwU0r5JQ0/pZRf0vBTSvklDT+llF/S8FNK+aX/Hw0InyJgMFo7AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 360x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 画出梯度下降可视化图像\n",
    "plt.figure(figsize=(5, 6))\n",
    "\n",
    "plt.plot(x, y)\n",
    "plt.scatter(x=ret[:800], y=[f(x) for x in ret[:800]], marker='.', c='r')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1e31f0c3-f0e0-4c68-9128-ac42b2ba58ca",
   "metadata": {},
   "source": [
    "800次epoch都没能到最小值附近"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "fee6798a-825f-4db7-beab-4275de9043d5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 画出梯度下降可视化图像\n",
    "plt.figure(figsize=(5, 6))\n",
    "\n",
    "plt.plot(x, y)\n",
    "plt.scatter(x=ret[:3500], y=[f(x) for x in ret[:3500]], marker='.', c='r')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "f3b009e4-8bc0-449b-8d65-4fef4da15d3b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2.4904921175248873"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ret[3500]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7ba07695-7ef7-4ee0-9aa0-9390b7c4856b",
   "metadata": {},
   "source": [
    "epoch=3500才到最小值附近"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "86290599-5f5e-4111-bd6a-9d1908ce78b6",
   "metadata": {},
   "source": [
    "### 第二种情况：学习率合适"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "6af3ba32-22b2-4abd-9a12-6b89b5f358f7",
   "metadata": {},
   "outputs": [],
   "source": [
    "ret = gradient_descent(learning_rate=0.1, method=2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "c8881ab3-90a5-4e04-990f-341f3250d7fe",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 画出梯度下降算法的可视化结果\n",
    "plt.figure(figsize=(5, 6))\n",
    "\n",
    "plt.plot(x, y)\n",
    "plt.scatter(x=ret, y=[f(x) for x in ret], marker='.', c='r')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "eeda6dec-4944-4e71-b424-9ec646431538",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "56"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(ret)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6435dba9-5f6c-4d6f-9399-e678c04d9c01",
   "metadata": {},
   "source": [
    "只通过56轮迭代就找到了最小值"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "568124d6-e9e6-4c9d-a802-50a48e8626cd",
   "metadata": {},
   "source": [
    "### 第三种情况：学习率较大"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "25244021-b8de-454e-9501-961c0e74344e",
   "metadata": {},
   "outputs": [],
   "source": [
    "ret = gradient_descent(learning_rate=0.7, method=2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "aa3ad161-42f4-4afd-9f41-b61c000ce528",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 画出梯度下降算法的可视化结果\n",
    "plt.figure(figsize=(5, 6))\n",
    "\n",
    "plt.plot(x, y)\n",
    "plt.plot(ret, [f(x) for x in ret], marker='.', c='r')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "7e376a7a-0b29-45d9-9a07-aa53012486c3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "17"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(ret)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a0a9d952-830d-46a1-81dc-603b54808a65",
   "metadata": {},
   "source": [
    "虽然学习过程十分波动，但还算可以找到最小值"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "547d0b69-7f9b-4fb6-8d80-73dc223de11b",
   "metadata": {},
   "source": [
    "### 第四种情况：学习率过大"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "720d76df-1276-4ff2-a918-64459ffd1c88",
   "metadata": {},
   "outputs": [
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "Input \u001b[1;32mIn [41]\u001b[0m, in \u001b[0;36m<cell line: 1>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[0m ret \u001b[38;5;241m=\u001b[39m \u001b[43mgradient_descent\u001b[49m\u001b[43m(\u001b[49m\u001b[43mlearning_rate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m2\u001b[39;49m\u001b[43m)\u001b[49m\n",
      "Input \u001b[1;32mIn [19]\u001b[0m, in \u001b[0;36mgradient_descent\u001b[1;34m(learning_rate, method)\u001b[0m\n\u001b[0;32m     22\u001b[0m i \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m\n\u001b[0;32m     23\u001b[0m \u001b[38;5;66;03m# 退出条件列出三种来\u001b[39;00m\n\u001b[1;32m---> 24\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[43mmethod\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m==\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m0\u001b[39;49m:\n\u001b[0;32m     25\u001b[0m     \u001b[38;5;66;03m# 第一种：达到最大迭代次数\u001b[39;00m\n\u001b[0;32m     26\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m i \u001b[38;5;241m>\u001b[39m max_iter:\n\u001b[0;32m     27\u001b[0m         \u001b[38;5;28;01mbreak\u001b[39;00m\n",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "ret = gradient_descent(learning_rate=1, method=2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a4595b35-216c-436c-b9d3-2d2eaa0bda01",
   "metadata": {},
   "source": [
    "学习率过大可能会无法收敛！"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f7b02e87-df8d-404c-a7f6-4d2fd4bcba7a",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
